/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.controller;

import com.evangelion.core.bean.Declaracion;
import com.evangelion.core.bean.Movimiento;
import com.evangelion.core.bean.MovimientoAux;
import com.evangelion.core.utils.MensajesFace;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author Kellycasma
 */
@ManagedBean
@ViewScoped
public class CalfacturacionController extends MensajesFace implements Serializable {

    private Declaracion declaracion;
    private List<Movimiento> listaFacturaIngreso;
    private List<MovimientoAux> listaFactIngAux;
    private List<Declaracion> listaDeclaciones;

    private boolean enableVistaPre;
    private boolean enableGuardar;
    private double valorDeclaracion;

    @PostConstruct
    @Override
    public void init() {
        declaracion = new Declaracion();
        declaracion.setAnno(0);
        declaracion.setTrimestre(0);
        listaDeclaciones = new ArrayList<Declaracion>();
        listaFactIngAux = new ArrayList<MovimientoAux>();
        enableGuardar = false;
        enableVistaPre = false;
        listaDeclaciones = declaracionService.listDeclaraciones("Facturacion");
    }

    public void buscarFacturaciones() {
        Declaracion decl = declaracionService.findDeclaracion(declaracion.getAnno(), declaracion.getTrimestre());
        if (decl != null) {
            declaracion = decl;
            msgAdvertencia("Este trimestre ya se encuentra registrado");
            enableVistaPre = true;
            enableGuardar = false;
            return;
        }
        declaracion.setMovimientoAuxList(new ArrayList<MovimientoAux>());
        Date fechaInicio = new Date();
        Date fechaFin = new Date();
        if (declaracion.getAnno() == 0) {
            msgAdvertencia("Seleccione un año");
            return;
        }
        if (declaracion.getTrimestre() == 0) {
            msgAdvertencia("Seleccione un trimestre");
            return;
        }
        Calendar calendar = Calendar.getInstance();
        if (declaracion.getTrimestre() == 1) {
            calendar.set(declaracion.getAnno(), 0, 01);
            fechaInicio = calendar.getTime();
            calendar.set(declaracion.getAnno(), 2, 31);
            fechaFin = calendar.getTime();
        }
        if (declaracion.getTrimestre() == 2) {
            calendar.set(declaracion.getAnno(), 3, 01);
            fechaInicio = calendar.getTime();
            calendar.set(declaracion.getAnno(), 5, 30);
            fechaFin = calendar.getTime();
        }
        if (declaracion.getTrimestre() == 3) {
            calendar.set(declaracion.getAnno(), 6, 01);
            fechaInicio = calendar.getTime();
            calendar.set(declaracion.getAnno(), 9, 30);
            fechaFin = calendar.getTime();
        }
        if (declaracion.getTrimestre() == 4) {
            calendar.set(declaracion.getAnno(), 10, 01);
            fechaInicio = calendar.getTime();
            calendar.set(declaracion.getAnno(), 12, 31);
            fechaFin = calendar.getTime();
        }
        listaFacturaIngreso = movimientoService.findListFacturasIngreso(null, fechaInicio, fechaFin);
        declaracion.setValorTotalFactura(movimientoService.findSumaFacturasIngreso(null, fechaInicio, fechaFin));
        declaracion.setValorFactDescontar(movimientoService.findSumaFacturasAdeclarar(null, fechaInicio, fechaFin));
        for (Movimiento movimiento : listaFacturaIngreso) {
            MovimientoAux movaux = new MovimientoAux();
            movaux.setFecha(movimiento.getFecha());
            movaux.setConcepto(movimiento.getConcepto().toUpperCase());
            movaux.setDocumento(movimiento.getDocumento());
            movaux.setDebe(movimiento.getDebe());
            movaux.setHaber(movimiento.getHaber());
            movaux.setIva(movimiento.getIva());
            movaux.setImpIVA(movimiento.getImpIVA());
            movaux.setBc(movimiento.getBc());
            movaux.setDescuentoDeclaracion(0.0);
            movaux.setTotal(movimiento.getTotal());
            movaux.setSeccion(movimiento.getSeccion());
            movaux.setCliente(movimiento.getCliente());
            movaux.setDeclaracion(declaracion);
            listaFactIngAux.add(movaux);
        }
        declaracion.setMovimientoAuxList(listaFactIngAux);
        if (listaFactIngAux.size() <= 0 || declaracion.getValorFactDescontar() <= 0) {
            enableGuardar = false;
            msgAdvertencia("No existe facturas a descontar");
        }
        enableVistaPre = true;
        enableGuardar = false;
    }

    public void save() {
        if (valorDeclaracion == declaracion.getValorDeclarado()) {
            declaracion.setFecha(new Date());
            declaracion.setFechadeclaracion(new Date());
            declaracion.setNvoValorFactura(declaracion.getValorDeclarado());
            declaracion.setTipo("Facturacion");
            System.out.println("declaracion.si.." + declaracion.getMovimientoAuxList().size());
            declaracionService.save(declaracion);
            init();
            msgCambiosGuardados();
        } else {
            msgInfoError("Ha modificado el valor del Imp. a declarar, Seleccion nuevamente vistaprevia");
            enableGuardar = false;
        }
    }

    public void vistaPrevia() {
        enableGuardar = false;
        valorDeclaracion = declaracion.getValorDeclarado();
        listaFactIngAux = new ArrayList<MovimientoAux>();
        if (declaracion.getId() != null) {
            listaFactIngAux = declaracion.getMovimientoAuxList();
        }
        if ((declaracion.getValorTotalFactura() - declaracion.getValorDeclarado()) > 0) {
            double porcentajeDesc = ((declaracion.getValorTotalFactura() - declaracion.getValorDeclarado()) / declaracion.getValorFactDescontar());
            System.out.println("porcentaje:" + porcentajeDesc);
            for (MovimientoAux movaux : declaracion.getMovimientoAuxList()) {
                if (movaux.getConcepto().toUpperCase().contains("PRACTIC")) {
                    movaux.setDescuentoDeclaracion(movaux.getTotal() * porcentajeDesc);
                }
            }
            enableGuardar = true;
        } else {
            msgAdvertencia("No hay valor a descontar");
        }
    }

    public List<Movimiento> getListaFacturaIngreso() {
        return listaFacturaIngreso;
    }

    public void setListaFacturaIngreso(List<Movimiento> listaFacturaIngreso) {
        this.listaFacturaIngreso = listaFacturaIngreso;
    }

    public Declaracion getDeclaracion() {
        return declaracion;
    }

    public void setDeclaracion(Declaracion declaracion) {
        this.declaracion = declaracion;
    }

    public boolean isEnableVistaPre() {
        return enableVistaPre;
    }

    public void setEnableVistaPre(boolean enableVistaPre) {
        this.enableVistaPre = enableVistaPre;
    }

    public boolean isEnableGuardar() {
        return enableGuardar;
    }

    public void setEnableGuardar(boolean enableGuardar) {
        this.enableGuardar = enableGuardar;
    }

    public List<Declaracion> getListaDeclaciones() {
        return listaDeclaciones;
    }

    public void setListaDeclaciones(List<Declaracion> listaDeclaciones) {
        this.listaDeclaciones = listaDeclaciones;
    }
}
